/**
 * 
 */
package co.edu.udistrital.audiomixer.bean;

import java.io.IOException;
import java.io.OutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.enterprise.context.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.AjaxBehaviorEvent;
import javax.inject.Named;

import org.richfaces.event.FileUploadEvent;
import org.richfaces.model.UploadedFile;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import co.edu.udistrital.audiomixer.bean.vo.ArchivoVO;
import co.edu.udistrital.audiomixer.bean.vo.UsuarioVO;
import co.edu.udistrital.audiomixer.entidad.Pista;
import co.edu.udistrital.audiomixer.entidad.Proyecto;
import co.edu.udistrital.audiomixer.entidad.Usuario;
import co.edu.udistrital.audiomixer.servicio.MixerServicio;
import co.edu.udistrital.audiomixer.servicio.PistaServicio;
import co.edu.udistrital.audiomixer.servicio.ProyectoServicio;
import co.edu.udistrital.audiomixer.servicio.UsuarioServicio;
import co.edu.udistrital.audiomixer.util.FtpUtil;

/**
 * @author edwin
 *
 */
@Named
@SessionScoped
public class MixerBean  implements Serializable {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	private final static Logger LOG = LoggerFactory.getLogger(MixerBean.class);

	private UsuarioVO usuario = new UsuarioVO(null);
	
	private Proyecto proyecto =  new Proyecto(); 
	
	private String pista = "";
	
	private List<UsuarioVO> usuarios = new ArrayList<UsuarioVO>();
	
	private String canalCargar="";
	
	@EJB
	private MixerServicio mixerServicio;
	
	@EJB
	private FtpUtil ftpUtil;
	
	@EJB
	private ProyectoServicio proyectoServicio;
	
	@EJB
	private PistaServicio pistaServicio;
	
	@EJB
	private UsuarioServicio servicioUsuarios;
	
	@PostConstruct
	public void inicializar(){
		cargar();
	}
	
	private String volumen="";
	
	List<ArchivoVO> archivos = new ArrayList<ArchivoVO>();
	
	public void cargar() {
		try {
			canalCargar = "1";
			usuarios = new ArrayList<UsuarioVO>();
			proyecto = new Proyecto();
			consultarUsuarios();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void consultarUsuarios() {
		archivos = new ArrayList<ArchivoVO>();
		usuarios = new ArrayList<UsuarioVO>();
		proyecto = new Proyecto();
		List<Usuario> usuariosBD = servicioUsuarios.consultar();
		for (Usuario usuario : usuariosBD) {
			if(this.usuario.getUsuario()==null){
				this.usuario.setUsuario(usuario);
			}
			if(usuario.getProyectos()==null){
				usuario.setProyectos(new ArrayList<Proyecto>());
			}
			usuarios.add(new UsuarioVO(usuario));
		}
	}
	
	 public void cargaArchivo(FileUploadEvent event) throws Exception {
	        UploadedFile item = event.getUploadedFile();
	        String clientid = event.getComponent().getClientId();
	        pista = clientid.substring(clientid.length()-1);
//	        fuente = new String(Base64.encodeBase64String(item.getData()));
	        if(proyecto==null || usuario==null || proyecto.getId()==0 || usuario.getUsuario().getId()==0){
	        	FacesMessage fm = new FacesMessage("Seleccione el proyecto y usuario","");
	    		fm.setSeverity(FacesMessage.SEVERITY_INFO);
	    		FacesContext.getCurrentInstance().addMessage(null, fm);
	    		throw new Exception("Seleccione el proyecto y usuario");
	        }
	        
	        ArchivoVO archivoVO = new ArchivoVO(pista, item.getData(), proyecto);
	        ftpUtil.escribir(archivoVO.getFuente(), archivoVO.getFile());
	        if(archivos.contains(archivoVO)){
	        	int indice = archivos.indexOf(archivoVO);
	        	archivos.remove(indice);
	        }
	        archivos.add(archivoVO);
	    }
	 
	public void paintMusic(OutputStream stream, Object object)
			throws IOException {
		ArchivoVO archivo = new ArchivoVO(object.toString());
		int indexOf = archivos.indexOf(archivo);
		if (indexOf != -1 ) {
			archivo = archivos.get(indexOf);
			stream.write(archivo.getFile());
			stream.close();
		}
	}
	
	public boolean esActivo(Object object)
			throws IOException {
		ArchivoVO archivo = new ArchivoVO(object.toString());
		return archivos.contains(archivo);
	}

	public void guardar(){
		LOG.info("GUARDANDO PISTA NUMERO "+pista);
		
		ArchivoVO archivo = new ArchivoVO(pista);
		int indexOf = archivos.indexOf(archivo);
		if (indexOf != -1 ) {
			archivo = archivos.get(indexOf);
			String fuente = archivo.getFuente();
			boolean esta = false;
			for (Pista pistaProyecto : archivo.getProyecto().getPistas()) {
				if(pistaProyecto.getDescripcion().equals(this.pista)){
					esta = true;
					pistaProyecto.setFuente(fuente);
//					pista.setUsuarioCarga(usuario.getUsuario());
					pistaProyecto.setVolumen((int)Double.parseDouble(volumen)*100);
					pistaProyecto.setUsuario(usuario.getUsuario().getId());
				}
			}
			if(!esta){
				Pista pistaProyecto = new Pista();
				int cantidad = pistaServicio.contar()+1;
				pistaProyecto.setId(cantidad);
				pistaProyecto.setDescripcion(this.pista);
				pistaProyecto.setFuente(fuente);
				pistaProyecto.setUsuario(usuario.getUsuario().getId());
				pistaProyecto.setVolumen((int)Double.parseDouble(volumen)*100);
				archivo.getProyecto().addToPistas(pistaProyecto);
			}
			archivo.setProyecto(proyectoServicio.actualizar(archivo.getProyecto()));
			proyecto = archivo.getProyecto();
		}
		LOG.info("TERMINO");
		
		
		FacesMessage fm = new FacesMessage("Se guardo pista: "+pista+"\nEn proyecto\n"+proyecto.getNombre(),"");
		fm.setSeverity(FacesMessage.SEVERITY_INFO);
		FacesContext.getCurrentInstance().addMessage(null, fm);
		
	}
	
	public void seleccionarProyectos(AjaxBehaviorEvent event){
		archivos = new ArrayList<ArchivoVO>();
		if(proyecto!=null){
			for (Pista pista : proyecto.getPistas()) {
				byte[] bytes = ftpUtil.leer(pista.getFuente());
				ArchivoVO archivoVO = new ArchivoVO(pista.getDescripcion(),bytes,proyecto);	
		        archivos.add(archivoVO);
			}
		}
	}

	public UsuarioVO getUsuario() {
		return usuario;
	}


	public void setUsuario(UsuarioVO usuario) {
		this.usuario = usuario;
	}

	public String getCanalCargar() {
		return canalCargar;
	}

	public void setCanalCargar(String canalCargar) {
		this.canalCargar = canalCargar;
	}

	public Proyecto getProyecto() {
		return proyecto;
	}

	public void setProyecto(Proyecto proyecto) {
		this.proyecto = proyecto;
	}

	public List<UsuarioVO> getUsuarios() {
		return usuarios;
	}

	public void setUsuarios(List<UsuarioVO> usuarios) {
		this.usuarios = usuarios;
	}

	public String getPista() {
		return pista;
	}

	public void setPista(String pista) {
		this.pista = pista;
	}

	/**
	 * @return the archivos
	 */
	public List<ArchivoVO> getArchivos() {
		return archivos;
	}

	/**
	 * @param archivos the archivos to set
	 */
	public void setArchivos(List<ArchivoVO> archivos) {
		this.archivos = archivos;
	}

	/**
	 * @return the volumen
	 */
	public String getVolumen() {
		return volumen;
	}

	/**
	 * @param volumen the volumen to set
	 */
	public void setVolumen(String volumen) {
		this.volumen = volumen;
	}

	
	
}
